"""
Case Type   : gs_checkse工具功能
Case Name   : 验证gs_checkse的A5检测项确保取消系统管理员服务端文件COPY权限检测与修复成功
Create At   : 2024/10/28
Owner       : lihongji
Description :
    1.设置enable_copy_server_files参数为off后检测A5项
    2.B5修复后查看enable_copy_server_files的值
    3.设置enable_copy_server_files参数为on后检测A5项
    4.修复A5不符合安全规范项目后再次检测
    5.在数据库查看enable_copy_server_files的值
Expect      :
    1.设置成功，检测不打印enable_copy_server_files告警信息
    2.修复成功，查看enable_copy_server_files的值为off
    3.设置成功，打印告警信息
    4.修复成功，不打印告警信息
    5.enable_copy_server_files为off
History     :
"""
import os
import time
import unittest

from testcase.utils.Logger import Logger
from testcase.utils.Common import Common
from testcase.utils.CommonSH import CommonSH
from testcase.utils.Constant import Constant
from yat.test import Node
from yat.test import macro


class GS_CHECKSE(unittest.TestCase):
    def setUp(self):
        self.log = Logger()
        self.log.info(f'----{os.path.basename(__file__)} start----')
        self.primaryNode = Node('PrimaryDbUser')
        self.sh_primary = CommonSH('PrimaryDbUser')
        self.constant = Constant()
        self.common = Common()
        self.env_path = macro.DB_ENV_PATH

    def test_gscheckse(self):
        step = ('----step1:设置enable_copy_server_files参数为off后检测A5项'
                'expect:设置成功，检测不打印enable_copy_server_files告警信息----')
        self.log.info(step)
        excute_msg = self.sh_primary.execute_gsguc(
            'reload', self.constant.GSGUC_SUCCESS_MSG,
            "enable_copy_server_files=off")
        self.assertTrue(excute_msg)
        gs_checkse_cmd = (f'source {self.env_path};'
                          f'gs_checkse -i A5 --detail')
        self.log.info(gs_checkse_cmd)
        check_res = self.common.get_sh_result(self.primaryNode, gs_checkse_cmd)
        self.assertNotIn("Ensure removal of server-side file COPY "
                         "permissions from system administrators.",
                         check_res, '执行失败' + step)

        step = ('----step2:B5修复后查看enable_copy_server_files的值 '
                'expect:修复成功，查看enable_copy_server_files的值为off----')
        self.log.info(step)
        gs_checkse_cmd = (f'source {self.env_path};'
                          f'gs_checkse -i B5 --detail;')
        self.log.info(gs_checkse_cmd)
        check_res = self.common.get_sh_result(self.primaryNode, gs_checkse_cmd)
        check_sql = "show enable_copy_server_files;"
        create_res = self.sh_primary.execut_db_sql(check_sql)
        self.log.info(create_res)
        self.assertIn('off', create_res, '执行失败' + step)
        self.assertIn("Setting Permission management succeed.",
                      check_res, '执行失败' + step)

        step = ('----step3:设置enable_copy_server_files参数为on后检测A5项 '
                'expect:设置成功，打印告警信息')
        self.log.info(step)
        excute_msg = self.sh_primary.execute_gsguc(
            'reload', self.constant.GSGUC_SUCCESS_MSG,
            "enable_copy_server_files=on")
        self.assertTrue(excute_msg)
        gs_checkse_cmd = (f'source {self.env_path};'
                          f'gs_checkse -i A5 --detail')
        self.log.info(gs_checkse_cmd)
        check_res = self.common.get_sh_result(self.primaryNode, gs_checkse_cmd)
        self.assertIn("Ensure removal of server-side file COPY "
                      "permissions from system administrators.",
                      check_res, '执行失败' + step)

        step = ('----step4:修复A5不符合安全规范项目后再次检测  '
                'expect:修复成功，不打印告警信息---')
        self.log.info(step)
        gs_checkse_cmd = (f'source {self.env_path};'
                          f'gs_checkse -i B5 --detail;'
                          f'gs_checkse -i A5 --detail;')
        self.log.info(gs_checkse_cmd)
        check_res = self.common.get_sh_result(self.primaryNode, gs_checkse_cmd)
        self.assertIn("Setting Permission management succeed.",
                      check_res, '执行失败' + step)
        self.assertNotIn("Ensure removal of server-side file COPY "
                         "permissions from system administrators.",
                         check_res, '执行失败' + step)

        step = ('----step5:在数据库查看enable_copy_server_files的值'
                'expect:enable_copy_server_files为off----')
        self.log.info(step)
        check_sql = "show enable_copy_server_files;"
        create_res = self.sh_primary.execut_db_sql(check_sql)
        self.log.info(create_res)
        self.assertIn('off', create_res, '执行失败' + step)

    def tearDown(self):
        step = '----step6:清理环境 expect:成功----'
        self.log.info(step)
        revoke = self.sh_primary.execute_gsguc(
            'reload', self.constant.GSGUC_SUCCESS_MSG,
            "enable_copy_server_files=on")
        self.assertTrue(revoke)
        self.log.info(f'----{os.path.basename(__file__)} end----')